package com.tedu.api.socket;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * 网络通讯---Socket【套接字】理解:互联网型Java类
 *
 * 网络应用遵循的原则：
 * C/S架构  Client 客户端  Server  服务器  早期应用【手机app-手机应用】
 * javaSE 桌面级软件---java并不擅长
 *
 * B/S架构  Browser 浏览器端  Server 服务端  后期应用【后台语言】
 * javaSE 做逻辑  Mysql 保存数据  Web---java管理后台
 *
 * 客户端  类 ：Client---->网络通讯 Socket
 * 服务器端  类:Server---->网络通讯 ServerSocket
 *
 * 网络通讯 ServerSocket ，Socket---底层传输协议支持两种：
 * TCP协议：可靠性好传输协议，基于字节流---传输低，安全性高【√ 传数据】
 * UDP协议：不可靠传输协议，基于数据根-----传输高，安全低【游戏】
 * 以上两种协议，封装底层代码中
 *
 *
 * 需求1：通过IP+端口 别人连接上自己！  相互建议连接
 * 需求2：相互建议连接：开启服务端---客户端给服务端发送：文本
 *        提示：start()   写逻辑
 *  网络通讯 Socket  具备方法，支持标准流
 *    客户端  |   服务端 ---Socket对象---调用方法
 *                                    getInputStream() 获取输入流
 *                                    getOutputStream()获取输出流
 */
public class Client {
    /**客户端---网络连接类以及方法使用
     * Socket类 关键字   包位置：java.net
     * 作用：数据网络传播，底层采用TCP协议【发送数据形式：安全，慢】
     */
    //1.创建私有的Socket类--->作用域：全局，访问在当前Client类中
    private Socket socket;
    //2.创建Client构造器---实例化Socket
    public Client(){
        /**
         * 实例化Socket(“IP地址”,端口号)
         * IP地址：找到目标主机
         * https://www.baidu.com/    一级域名
         * http://220.101.38.149/    实际访问地址：IP形式
         * 本地IP：localhost   127.0.0.1
         *
         * 端口号：所有互联网型软件具备--软件大门
         *                          Mysql软件端口号：3306
         *                          网页默认端口号：80
         *  端口号通常代表形式：四个数值，表示对应软件
         */
        try {
            socket =new Socket("192.168.71.139",8848);
        } catch (IOException e) {
            e.printStackTrace();
        } finally{

        }
    }
    //3.创建一个方法 start() 逻辑 使用IO流 传输数据
    public void start() throws IOException {
        //利用socket对象调用：标准流方法
        OutputStream os=null;

        // 低级流---OutputStream【抽象父类】与FileOutputStream【子类】
        //高级流----转换流，目的：指定编码集   UTF8
        OutputStreamWriter osw=null;
    //InputStreamReader isr=null;

        BufferedWriter bw=null;

        PrintWriter pw=null;

        try {
            os=socket.getOutputStream();  //输出流
            osw=new OutputStreamWriter(os,"UTF8");
        //isr=new InputStreamReader(,"UTF8");
            //高级流----字符输出流，目的：高效数据传输
            bw=new BufferedWriter(osw);

            //高级流---PrintWriter.目的：输出一行行文本
            pw=new PrintWriter(bw,true);
            // 客户端一直跟服务器端---说【循环】
            System.out.println("客户端用户：请输入文字：");
            Scanner input=new Scanner(System.in);//测试--控制台输入文本
            while(true){  //死循环---一直与服务器说话
                String say=input.nextLine();
                pw.println(say);  //写出一行行文字
                System.out.println("写出完毕");
            }
//            while(true){
//                String
//            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (pw!=null);
            pw.close();
        }
    }
    //4.创建主方法---Client类运行
    public static void main(String[] args) throws IOException {
        //5.创建客户端类---默认构造器--调用实例化Socket：IP,端口
        Client client=new Client();
        //6.调用开始方法---传输数据：IO
        client.start();
    }
}
